package parser;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

/**
 * @author 石小俊
 * @date 2023年07月12日 15:50
 */
public class DOMParser {

    public static void main(String[] args) {
        // 创建DOM工厂,通过静态工厂创建对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            // 获取解析器
            DocumentBuilder builder = factory.newDocumentBuilder();

            // 解析文档
            Document document = builder.parse(DOMParser.class.getClassLoader().getResourceAsStream("students.xml"));

            // 根据解析后的数据进行操作
            // 获取根元素
            Element root = document.getDocumentElement();
            // 获取元素名
            System.out.println("标签名:"+root.getTagName());
            // 根据属性名获取属性值
            String no = root.getAttribute("no");
            System.out.println("no属性:"+no);
            // 获取所有属性
            NamedNodeMap attributes = root.getAttributes();
            for(int i = 0; i < attributes.getLength(); i++){
                // 获取当前遍历的元素
                Node node = attributes.item(i);
                System.out.println(node);
            }

            // 获取指定元素的所有子元素
            NodeList childNodes = root.getChildNodes();
            System.out.println("子节点数量:"+childNodes.getLength());
            for(int i = 0; i < childNodes.getLength(); i++){
                // 取出当前遍历的节点
                Node node = childNodes.item(i);
                // 需要判断当前遍历的节点的类型
                // 不同类型的节点需要做的处理也不同
                // 如果是元素节点
                if(node.getNodeType() == Node.ELEMENT_NODE){
                    Element ele = (Element) node;
                    System.out.println("标签名:"+ele.getTagName());
                    NamedNodeMap attributes2 = ele.getAttributes();
                    for(int j = 0; j < attributes2.getLength(); j++){
                        Node item = attributes2.item(j);
                        System.out.println(item);
                    }
                    NodeList nodes = ele.getChildNodes();
                    for(int j = 0; j < nodes.getLength(); j++){
                        Node item = nodes.item(j);
                        if(item.getNodeType() == Node.ELEMENT_NODE){
                            Element nameEle = (Element) item;
                            System.out.println("标签名:"+nameEle.getTagName());
                        }
                        if(item.getNodeType() == Node.TEXT_NODE){
                            System.out.println("姓名:"+node.getTextContent());
                        }
                    }
                }

                // 如果是文本节点
                if(node.getNodeType() == Node.TEXT_NODE){
                    System.out.println("文本内容:"+node.getTextContent());
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
